//
//  CCAccounVeiwModel.swift
//  CC-SinaWeibo
//
//  Created by Chenchen on 16/2/20.
//  Copyright © 2016年 Chenchen. All rights reserved.
//

import UIKit
// 导入AFNetworking框架
import AFNetworking

// 视图模型
class CCAccounVeiwModel: NSObject {
    // 设置 静态视图模型类型
    static let sharedAccountViewModel: CCAccounVeiwModel = CCAccounVeiwModel()
    // 定义用户账户模型属性
    var userAccount: CCUserAccount?
    
    // 将构造函数私有化
     private override init() {
        super.init()
        // 调用 读取数据模型
        userAccount = CCUserAccount.loadUserAccount()
//        print(userAccount)
    }
    
// MARK: 根据模型做相关逻辑操作
    // 查看用户是否登录
    var userLogin: Bool {
        // 如果 access_token 不为空, 说明已经登录成功
        return userAccount?.access_token != nil
    }
    
    // 计算当前登录用户的token
    var access_token: String? {
        return userAccount?.access_token
    }
    
    // 用户名称的只读属性
    var userName: String? {
        return userAccount?.name
    }
    
    // 用户头像
    var headImageURL: NSURL? {
        if let urlString = userAccount?.avatar_large {
//            print("------->",urlString)
            return NSURL(string: urlString)
        }
        return nil
    }
    
    // 加载用户的tonken
    func loadAccessTonken (code: String, finished:(isSuccess: Bool) -> ()) {
        
        // 使用AFN发起post的http请求
        let urStr = "https://api.weibo.com/oauth2/access_token"
        
        // 以字典的格式传递参数
        let parameters = ["client_id":client_id, "client_secret":client_secret, "grant_type":"authorization_code", "code":code, "redirect_uri":redirect_uri]
        
        // AFN
        let AFN = AFHTTPSessionManager()
        
        // AFN默认不支持这种格式,所以添加
        AFN.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        // POST请求,加载数据
        AFN.POST(urStr, parameters: parameters, progress: nil, success: { (_, result) -> Void in  // 成功
            
            // 将AnyObject转换为字典类型数据
            guard let dict = result as? [String : AnyObject] else {
                
                // 数据类型不匹配,默认访问出错
                finished(isSuccess: false)
                
                return
            }
            
            // 用户帐户
            let userAccount = CCUserAccount(dict: dict)
            
            // 调用方法,获取用户信息,发起网络请求
            self.loadUserInfo(userAccount, finished: finished)
            
            }) { (_, error) -> Void in  // 失败
                
                // 打印
                print("-->失败",error)
        }
    }
    
// MARK: 请求获取用户信息
    private func loadUserInfo(userAccount:CCUserAccount, finished: (isSuccess: Bool) -> ()) {
        
        // url
        let urlString = "https://api.weibo.com/2/users/show.json"
        
        // 取出字典key值
        let parameters = ["access_token":userAccount.access_token!, "uid": userAccount.uid!]
        
        // AFN
        let AFN = AFHTTPSessionManager()
        
        // get请求,
        AFN.GET(urlString, parameters: parameters, progress: nil, success: { (_, result) -> Void in  // 成功

            // 将AnyObject转换为字典类型数据
            guard let dict = result as? [String : AnyObject] else {
                
            // 回调错误信息
                finished(isSuccess: false)
                
                return
            }
            
            // 程序到了这里,就说明一定转换成功
            // 取值 name
            let name = dict["name"] as! String
            // 取值 avatar_large
            let avatar_large = dict["avatar_large"] as! String
            
            // 完善模型数据
            userAccount.name = name
            userAccount.avatar_large = avatar_large
            
            // 调用归档方法
            userAccount.saveAccout()
            
            // 给单例对象的用户模型赋值
//            CCAccounVeiwModel.sharedAccountViewModel.userAccount = userAccount
            self.userAccount = userAccount
            
            // 用户信息保存完毕后,执行成功的回调
            finished(isSuccess: true)
            
            }) { (_, error) -> Void in  // 失败
                
                // 执行失败的回调
                finished(isSuccess: false)
                
                // 打印
                print("-->失败",error)
        }
    }

    
}
